package com.heima.web;

import com.heima.common.R;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/*
    用来处理文件上传和下载
     1. 文件上传
        1.1 定义方法，参数里面设置一个MultipartFile 类型的参数。
        1.2 参数名不能乱写，乱写就收不到文件。要按照页面的name属性的值来写。
            elementui默认情况下前端设置的name，属性值是 ： file
 */
@RestController
public class FileController {
    @Value("${fileDir}")
    private String fileDirPath;

    /**
     * 文件上传
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/common/upload")
    public R upload(MultipartFile file) throws IOException {
        //1、获取原始文件名字 123.jpg
        String originalFilename = file.getOriginalFilename();

        //2、切割出来后缀名 .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //3、构建一个新的文件名字 【UUID】 07a920eaf02d4dbb9684b656d0eb55c6
        String preffix = UUID.randomUUID().toString().replaceAll("-", "");

        //4、拼接出来一个新的图片名字 07a920eaf02d4dbb9684b656d0eb55c6.jpg
        String newName = preffix + suffix;

        //5、构建保存的路径位置，如果不存在，就创建这个路径
        File fileDir = new File(fileDirPath);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }

        //6、保存文件到指定位置
        //  new File(fileDir, newName) : 在fileDir目录下有newName文件
        file.transferTo(new File(fileDir, newName));

        //7、返回
        return R.success(newName);
    }

    @GetMapping("/common/download")
    public void download(String name, HttpServletResponse resp) throws IOException {
        //构建文件位置指向
        String file = fileDirPath + name;

        //找到文件读取成输入流
        FileInputStream fis = new FileInputStream(file);

        //构建一个输出流，输出给客户端
        ServletOutputStream fos = resp.getOutputStream();

        //输入流和输出流对接
        IOUtils.copy(fis, fos);

        /*byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        fos.close();
        fis.close();*/
    }
}
